Mackerel を触ってみる(ログ監視編)

Mackerel を触ってみる(ログ監視編)

Mackerel でログ監視をやってみました。
Clock Icon2024.08.28

はじめに

これらのブログの続編になります。

前提知識

Mackerel の公式チェックプラグイン集の check-log を使うとログ監視が行えます。
check-log を使うためには公式チェックプラグイン集を事前にインストールしておく必要があります。
インストールについてはこちらのブログで実施しているので、興味がある方はこちらをご覧ください。

やってみる

mackerel-agent.conf を編集し、ログ監視を実装してみます。

1. rsyslog をインストールする

検証用に作成した EC2 の OS は Amazon Linux 2023(以降、AL2023 と表記)です。
Amazon Linux 2 までは /var/log/messages システムログが出力されていましたが、AL2023 から /var/log/messages 等のログが作成されなくなりました。
しかし、check-log を使用してログ監視するためには、システムログを出力したいです。
そこで、rsyslog をインストールしてログファイルが作成されるようにします。

セッションマネージャー経由で監視対象の EC2 にログインします。
rsyslog をインストール&起動して、/var/log/messages が作成されたことを確認します。

実際のログ
$ sudo dnf update
Last metadata expiration check: 1 day, 4:15:12 ago on Tue Aug 27 01:53:18 2024.
Dependencies resolved.
Nothing to do.
Complete!
$
$ cd /var/log
### messages が存在していないことを確認
$ ls -l
total 1612
lrwxrwxrwx. 1 root   root                39 Aug 15 17:16 README -> ../../usr/share/doc/systemd/README.logs
drwxr-xr-x. 4 root   root                34 Aug 28 05:17 amazon
drwx------. 2 root   root                23 Aug 27 01:47 audit
-rw-rw----. 1 root   utmp                 0 Aug 15 17:16 btmp
drwxr-x---. 2 chrony chrony              72 Aug 27 01:47 chrony
-rw-r-----. 1 root   adm               8806 Aug 28 05:17 cloud-init-output.log
-rw-r-----. 1 root   adm             367742 Aug 28 05:17 cloud-init.log
-rw-r--r--. 1 root   root            874026 Aug 28 06:08 dnf.librepo.log
-rw-r--r--. 1 root   root            288949 Aug 28 06:08 dnf.log
-rw-r--r--. 1 root   root             84456 Aug 28 06:08 dnf.rpm.log
-rw-r--r--. 1 root   root              3079 Aug 28 06:08 hawkey.log
drwxr-sr-x+ 3 root   systemd-journal     46 Aug 27 01:47 journal
-rw-rw-r--. 1 root   utmp                 0 Aug 15 17:15 lastlog
drwx------. 2 root   root                 6 Aug 15 17:16 private
drwxr-xr-x. 2 root   root                30 Aug 28 05:16 sa
drwxr-x---. 2 root   root                 6 Jun 12 22:04 sssd
-rw-------. 1 root   root                 0 Aug 15 17:16 tallylog
-rw-rw-r--. 1 root   utmp              9216 Aug 28 05:17 wtmp
$
### rsyslog をインストール
$ sudo dnf install rsyslog
Last metadata expiration check: 1 day, 4:16:01 ago on Tue Aug 27 01:53:18 2024.
Dependencies resolved.
================================================================================================================================================
 Package                              Architecture              Version                                    Repository                      Size
================================================================================================================================================
Installing:
 rsyslog                              x86_64                    8.2204.0-3.amzn2023.0.4                    amazonlinux                    784 k
Installing dependencies:
 libestr                              x86_64                    0.1.11-1.amzn2023.0.2                      amazonlinux                     26 k
 libfastjson                          x86_64                    0.99.9-1.amzn2023.0.3                      amazonlinux                     39 k
Installing weak dependencies:
 rsyslog-logrotate                    x86_64                    8.2204.0-3.amzn2023.0.4                    amazonlinux                     10 k

Transaction Summary
================================================================================================================================================
Install  4 Packages

Total download size: 859 k
Installed size: 2.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): libestr-0.1.11-1.amzn2023.0.2.x86_64.rpm                                                                 400 kB/s |  26 kB     00:00
(2/4): libfastjson-0.99.9-1.amzn2023.0.3.x86_64.rpm                                                             556 kB/s |  39 kB     00:00
(3/4): rsyslog-8.2204.0-3.amzn2023.0.4.x86_64.rpm                                                               9.1 MB/s | 784 kB     00:00
(4/4): rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64.rpm                                                     517 kB/s |  10 kB     00:00
------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                           5.5 MB/s | 859 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                        1/1
  Installing       : libfastjson-0.99.9-1.amzn2023.0.3.x86_64                                                                               1/4
  Installing       : libestr-0.1.11-1.amzn2023.0.2.x86_64                                                                                   2/4
  Installing       : rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64                                                                       3/4
  Installing       : rsyslog-8.2204.0-3.amzn2023.0.4.x86_64                                                                                 4/4
  Running scriptlet: rsyslog-8.2204.0-3.amzn2023.0.4.x86_64                                                                                 4/4
Created symlink /etc/systemd/system/multi-user.target.wants/rsyslog.service → /usr/lib/systemd/system/rsyslog.service.

  Verifying        : libestr-0.1.11-1.amzn2023.0.2.x86_64                                                                                   1/4
  Verifying        : libfastjson-0.99.9-1.amzn2023.0.3.x86_64                                                                               2/4
  Verifying        : rsyslog-8.2204.0-3.amzn2023.0.4.x86_64                                                                                 3/4
  Verifying        : rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64                                                                       4/4

Installed:
  libestr-0.1.11-1.amzn2023.0.2.x86_64                 libfastjson-0.99.9-1.amzn2023.0.3.x86_64     rsyslog-8.2204.0-3.amzn2023.0.4.x86_64
  rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64

Complete!
$
### messages が作成されたことを確認
$ ls -l
total 1648
lrwxrwxrwx. 1 root   root                39 Aug 15 17:16 README -> ../../usr/share/doc/systemd/README.logs
drwxr-xr-x. 4 root   root                34 Aug 28 05:17 amazon
drwx------. 2 root   root                23 Aug 27 01:47 audit
-rw-rw----. 1 root   utmp                 0 Aug 15 17:16 btmp
drwxr-x---. 2 chrony chrony              72 Aug 27 01:47 chrony
-rw-r-----. 1 root   adm               8806 Aug 28 05:17 cloud-init-output.log
-rw-r-----. 1 root   adm             367742 Aug 28 05:17 cloud-init.log
-rw-r--r--. 1 root   root            875926 Aug 28 06:09 dnf.librepo.log
-rw-r--r--. 1 root   root            294805 Aug 28 06:09 dnf.log
-rw-r--r--. 1 root   root             85012 Aug 28 06:09 dnf.rpm.log
-rw-r--r--. 1 root   root              3259 Aug 28 06:09 hawkey.log
drwxr-sr-x+ 3 root   systemd-journal     46 Aug 27 01:47 journal
-rw-rw-r--. 1 root   utmp                 0 Aug 15 17:15 lastlog
-rw-------. 1 root   root                 0 Aug 28 06:09 maillog
-rw-------. 1 root   root                 0 Aug 28 06:09 messages
drwx------. 2 root   root                 6 Aug 15 17:16 private
drwxr-xr-x. 2 root   root                30 Aug 28 05:16 sa
-rw-------. 1 root   root                 0 Aug 28 06:09 secure
-rw-------. 1 root   root                 0 Aug 28 06:09 spooler
drwxr-x---. 2 root   root                 6 Jun 12 22:04 sssd
-rw-------. 1 root   root                 0 Aug 15 17:16 tallylog
-rw-rw-r--. 1 root   utmp              9216 Aug 28 05:17 wtmp
$
### rsyslog のステータス確認
$ systemctl status rsyslog
○ rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
$
### システム起動時に rsyslog が自動起動するように設定
$ sudo systemctl enable rsyslog
$ systemctl status rsyslog
○ rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
$
### rsyslog を手動起動
$ sudo systemctl start rsyslog
### rsyslog のステータス確認
$ systemctl status rsyslog
● rsyslog.service - System Logging Service
     Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-08-28 06:11:46 UTC; 2s ago
       Docs: man:rsyslogd(8)
             https://www.rsyslog.com/doc/
   Main PID: 4553 (rsyslogd)
      Tasks: 3 (limit: 508)
     Memory: 3.9M
        CPU: 434ms
     CGroup: /system.slice/rsyslog.service
             └─4553 /usr/sbin/rsyslogd -n
$

/etc/rsyslog.conf の内容を確認すると、デフォルトで以下の記載がありました。

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

「すべてのプライオリティレベルのメッセージのうち、メール、認証、cron 関連のメッセージを除いたものが、/var/log/messages に記録される」
という設定であることが分かります。
実施したいログ監視のテストは現在の設定で実施できることが分かったので、/etc/rsyslog.conf はそのまま使用します。

2. mackerel-agent.conf を編集する

セッションマネージャー経由で監視対象の EC2 にログインします。
/etc/mackerel-agent/mackerel-agent.conf は、デフォルトだと以下のように API キーだけ記載されていて、それ以外はコメントアウトされた状態です。

/etc/mackerel-agent/mackerel-agent.conf

apikey = "APIキー"
# pidfile = "/var/run/mackerel-agent.pid"
# root = "/var/lib/mackerel-agent"
# verbose = false
# apikey = ""

# [host_status]
# on_start = "working"
# on_stop = "poweroff"

# [filesystems]
# ignore = "/dev/ram.*"

# Configuration for Custom Metrics Plugins
# see also: https://mackerel.io/ja/docs/entry/advanced/custom-metrics

# followings are mackerel-agent-plugins https://github.com/mackerelio/mackerel-agent-plugins

# Plugin for Apache2 mod_status
# By default, the plugin accesses to http://127.0.0.1/server-status?auto
# [plugin.metrics.apache2]
# command = "mackerel-plugin-apache2"

# Plugin for EC2 CPU Credit
# [plugin.metrics.aws-ec2_cpucredit]
# command = "mackerel-plugin-aws-ec2-cpucredit"

# Plugin for AWS ELB
# [plugin.metrics.aws-elb]
# command = "mackerel-plugin-aws-elb"

# Plugin for Amazon RDS
# [plugin.metrics.aws-rds]
# command = "mackerel-plugin-aws-rds -identifier=<required>"

# Plugin for Elasticsearch
# By default, the plugin accesses Elasticsearch on localhost.
# [plugin.metrics.elasticsearch]
# command = "mackerel-plugin-elasticsearch"

# Plugin for HAProxy
# By default, the plugin accesses Elasticsearch on localhost.
# [plugin.metrics.haproxy]
# command = "mackerel-plugin-haproxy"

# Plugin for JVM
# Required javaname
# [plugin.metrics.jvm]
# command = "mackerel-plugin-jvm -javaname=<required>"

# Plugin for Linux
# [plugin.metrics.linux]
# command = "mackerel-plugin-linux"

# Plugin for Memcached
# [plugin.metrics.memcached]
# command = "mackerel-plugin-memcached"

# Plugin for MongoDB
# [plugin.metrics.mongodb]
# command = "mackerel-plugin-mongodb"

# Plugin for MySQL
# Appropriate previlege settings required.
# By default, the plugin accesses MySQL on localhost by 'root' with no password.
# [plugin.metrics.mysql]
# command = "mackerel-plugin-mysql"

# Plugin for Nginx
# By default, the plugin accesses to http://localhost:8080/nginx_status
# [plugin.metrics.nginx]
# command = "mackerel-plugin-nginx"

# Plugin for PHP APC
# [plugin.metrics.php-apc]
# command = "mackerel-plugin-php-apc"

# Plugin for Plack
# By default, the plugin accesses to http://localhost:5000/server-status?json
# [plugin.metrics.plack]
# command = "mackerel-plugin-plack"

# Plugin for PostgreSQL
# Appropriate previlege settings required.
# By default, the plugin accesses PostgreSQL on localhost.
# [plugin.metrics.postgres]
# command = "mackerel-plugin-postgres"

# Plugin for Redis
# By default, the plugin accesses Redis on localhost.
# [plugin.metrics.redis]
# command = "mackerel-plugin-redis"

# Plugin for SNMP
# [plugin.metrics.pps]
# command = "mackerel-plugin-snmp -name='pps' -community='private' '.1.3.6.1.2.1.31.1.1.1.7.2:eth01in:1:0' '.1.3.6.1.2.1.31.1.1.1.11.2:eth01out:1:0'"

# Plugin for Squid
# [plugin.metrics.squid]
# command = "mackerel-plugin-squid"

# Plugin for Varnish
# [plugin.metrics.varnish]
# command = "mackerel-plugin-varnish"

# Plugin for munin (wrapper)
# [plugin.metrics.nfsd]
# command = "mackerel-plugin-munin -plugin=/usr/share/munin/plugins/nfsd"
# [plugin.metrics.bind9]
# command = "mackerel-plugin-munin -plugin=/etc/munin/plugins/bind9 -plugin-conf-d=/etc/munin/plugin-conf.d"
# [plugin.metrics.postfix]
# command = "MUNIN_LIBDIR=/usr/share/munin mackerel-plugin-munin -plugin=/usr/share/munin/plugins/postfix_mailqueue -name=postfix.mailqueue"

# followings are other samples
# [plugin.metrics.vmstat]
# command = "ruby /etc/sensu/plugins/system/vmstat-metrics.rb"
# [plugin.metrics.curl]
# command = "ruby /etc/sensu/plugins/http/metrics-curl.rb"

mackerel-agent.conf に設定を追加します。

実際のログ
$ cd /etc/mackerel-agent/
$ ls -l
total 4
-rw-r--r--. 1 root root 3605 Aug 27 01:53 mackerel-agent.conf
$
$ sudo vi mackerel-agent.conf

== vi 上で以下を追記する ==
# check-log
[plugin.checks.Log_Messages_Error]
command = ["check-log", "--file", "/var/log/messages", "--pattern", "error", "--icase" ]
prevent_alert_auto_close = true
== ここまで ==

### 設定ファイル(mackerel-agent.conf)のシンタックスチェック
$ sudo mackerel-agent configtest
SUCCESS (/etc/mackerel-agent/mackerel-agent.conf)
$
### mackerel-agent を再起動
$ sudo systemctl restart mackerel-agent
$

vi で追記した設定は、
/var/log/messages ファイルの中に "error" という文字列(大小文字を区別しない)が含まれているかをチェックし、見つかった場合にアラートを発報する」
というものです。
(ちなみに prevent_alert_auto_close = true により、アラート発生以後の監視結果が OK になってもアラートは自動でクローズされず、オープンのままになるため、手動クローズが必要という設定です)

以上で mackerel-agent.conf の編集は完了です。

Mackerel のホスト詳細画面で確認すると、Monitors 欄に「Log_Messages_Error」が追加されました。
1

次は実際にアラート発報ができるかテストしてみます。

3. テストしてみる

再びセッションマネージャー経由で EC2 にログインします。
EC2 上で以下コマンドを実行します。

sudo logger -p err "This is a test error message for Mackerel"

上記のコマンドは、
logger コマンドを実行し、エラーレベルのログメッセージ「This is a test error message for Mackerel」を syslog デーモンに送信する」
というものです。

実行後、数分経たずしてアラートメールを受信しました。
2

Mackerel でもアラートが上がっていることが確認できました。
3

手動クローズが必要という設定にしているため、テストが終わったら忘れずにクローズしておきましょう。
4
5
6

ということで、ログ監視を設定し、error という文字列が出力されたときにアラートが発報されることが確認できました。
(ちなみに、パターンのマッチ条件を「大小文字を区別しない」としたので、「This is a test ERROR message for Mackerel」も試してみましたが、ちゃんとアラート発報されました)

あとがき

本記事ではログ監視編として、rsyslog の準備、mackerel-agent.conf の編集、テストまでをまとめました。
この記事がどなたかのお役に立てれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は
様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.